package day21.zhiyou100;

import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.UUID;


class FileUploadServer {
    public static void main(String[] args) throws Exception {
        // 创建服务器端对象
        ServerSocket server = new ServerSocket(8088);
        // 接收一个客户端
        Socket socket = server.accept();
        // 从网络流中读取写入的数据
        InputStream is = socket.getInputStream();
        // 需要指定把文件上传到磁盘的什么位置E:\321-Java正课\day02\resouce目录下
        // E:\aa\bb
        File parent = new File("E:\\aa\\bb");// 父目录
        // 首先需要判断下该文件夹是否存在
        if (!parent.exists()) {
            parent.mkdirs();// 创建该文件夹
        }
        // UUID
        String filename = UUID.randomUUID().toString().replace("-","") + ".pdf";
        // 文件字节输出流
        FileOutputStream fos = new FileOutputStream(new File(parent,filename));
        // 边读边写
        int len = 0;
        byte[] data = new byte[1024];
        while ((len = is.read(data)) != -1) {
            fos.write(data,0,len);// 三个参数  data  0  len
        }
        // 此时需要告诉客户端我服务器端已经上传成功的状态
        OutputStream os = socket.getOutputStream();
        os.write("我已经上传成功".getBytes());
        socket.shutdownOutput();
        server.close();
    }
}

//把桌面的C:\Users\Administrator\Desktop\java开发手册.pdf 上传到 E:\321-Java正课\day02\resouce目录下
public class FileUploadClient {
    public static void main(String[] args) throws Exception {
        // 创建客户端对象
        Socket socket = new Socket("127.0.0.1", 8088);// 8080
        // 获取网络字节输出流对象
        OutputStream os = socket.getOutputStream();
        // 创建文件对象
        File file = new File("C:\\Users\\Administrator\\Desktop\\Java开发手册（嵩山版）.pdf");
        // 文件字节输入流
        FileInputStream fis = new FileInputStream(file);
        // 边读边写
        int len = 0;
        byte[] data = new byte[1024];
        while ((len = fis.read(data)) != -1) {
            // 写入到网络中
            os.write(data,0,len);// 三个参数  读取到字节值  从数据的起始位置  有效的字节个数
        }
        // 读取完毕同时写完了，此时需要写入一个终止状态
        socket.shutdownOutput();
        // 接收服务器端给你发送的确认状态
        InputStream is = socket.getInputStream();
        int len2 = 0;
        byte[] data2 = new byte[1024];
        while ((len2 = is.read(data2)) != -1) {
            // 写入到网络中
            System.out.println(new String(data2,0,len2));
        }
        socket.close();
    }
}
